package com.gitee.huanminabc.dynamicdb.core;

import com.gitee.huanminabc.dynamicdb.common.DBSupplierEx;
import org.apache.logging.log4j.util.Strings;
/**
 * @author huanmin
 * @date 2024/11/22
 */
public class DBSwatchUtil {
    //这个方法是可以在代码或者线程内部切换数据源, 无副作用
    public static <T> T toggleDB(String dbKey, DBSupplierEx<T> runnable) throws Throwable {
        if (Strings.isEmpty(dbKey)) {
            return runnable.get();
        }
        //记录之前的数据源
        String oldDbKey = DbKeysManage.currentDbKey();
        try {
            //切换为指定数据库
            DbKeysManage.switchDbKey(dbKey);
            //事务添加,因为可能之前已经开启了事务,这里就需要加入他的事务管理器或者新建事务管理器,无论是否子有没有开启事务,都需要有事务管理
            if (TransactionalManage.hasTransaction()){
                return  muchTransactional(runnable);
            }
            //执行业务方法
            return runnable.get();
        } finally {
            //还原为默认配置
            DbKeysManage.switchDbKey(oldDbKey);
        }
    }


    //手动开启多数据源事务,无论当前有没有事务,都会可以使用, 无副作用
    public static <T> T muchTransactional(DBSupplierEx<T> runnable) throws Throwable {
        try {
            //开启事务
            TransactionalManage.openTransaction();
            //执行业务方法
            T run = runnable.get();
            TransactionalManage.commit();
            return run;
        } catch (Throwable e) {
            TransactionalManage.rollback();
            throw e;
        }
    }
}
